package othello.client.playroom;

import gwt.canvas.client.Image;
import gwt.canvas.client.ImageListener;

import java.util.HashMap;
import java.util.Map;

import othello.client.utility.screen.DrawableImage;

/**
 * <p>
 * 画像に関する設定を保持、実行するクラス。
 * </p>
 * TODO 設定については外部ファイルへの切り出しが定石だがGWTの絡みで可能か不明。要調査
 * 
 * @author onjiro.mohyahya
 */
class ImageSettingsDefault implements ImageSettings {

	/**
	 * 画像取得元の画像のURL
	 */
	private static final String IMAGE_URL = "/img/othello.png";

	/**
	 * 位置情報の変換器
	 */
	private final PositionConvertor convertor = new Convertor();

	/**
	 * 作成した分割後のイメージを格納するマップ
	 */
	private final Map<ImageKey, DrawableImage> images = new HashMap<ImageKey, DrawableImage>();

	/**
	 * 設定の読み込み完了を示します。
	 */
	private boolean loadCompleted = false;

	/**
	 * キャンバスの端から左上端のマスまでの距離
	 */
	private final Position paddingSize = new Position(12, 12);

	/**
	 * 各マスのサイズ
	 */
	private final Position cellSize = new Position(58, 56);

	/**
	 * <p>
	 * デフォルト・コンストラクター
	 * </p>
	 * <p>
	 * 規定のURLの画像を読み込んで、必要な画像、設定を構築します。
	 * </p>
	 */
	public ImageSettingsDefault() {
		new Image(IMAGE_URL, new ImageListener() {
			@Override
			public void onLoadingComplete(Image image) {
				// TODO 暫定画像用の設定
				DrawableImage fullImage = new DrawableImage(image);
				images.put(ImageKey.Board, new DrawableImage(fullImage, 0, 0,
						480, 480));
				images.put(ImageKey.BlackStone, new DrawableImage(fullImage,
						11, 493, 52, 52));
				images.put(ImageKey.WhiteStone, new DrawableImage(fullImage,
						70, 488, 52, 52));
				loadCompleted = true;
			}
		});

	}

	/**
	 * 読み込んだ画像を取得します。
	 * 
	 * @return Map<ImageKey, DrawableImage>
	 */
	@Override
	public Map<ImageKey, DrawableImage> getImages() {
		return images;
	}

	/**
	 * 設定の読み込みが完了しているかを判定します。
	 * 
	 * @return true:読み込み完了
	 */
	@Override
	public boolean isLoadCompleted() {
		return loadCompleted;
	}

	/**
	 * 位置変換器を取得します。
	 */
	@Override
	public ImageSettings.PositionConvertor getPositionConvertor() {
		return this.convertor;
	}

	/**
	 * 各マスの大きさを取得します。
	 */
	@Override
	public Position getCellSize() {
		return this.cellSize;
	}

	/**
	 * 位置変換器の実装
	 */
	private final class Convertor implements ImageSettings.PositionConvertor {
		@Override
		public Position toGameBoardPosition(int xInPixel, int yInPixel) {
			return new Position((xInPixel - paddingSize.x) / cellSize.x,
					(yInPixel - paddingSize.y) / cellSize.y);
		}

		@Override
		public Position toPixelPosition(int xInBoard, int yInBoard) {
			return new Position(paddingSize.x + cellSize.x * xInBoard,
					paddingSize.y + cellSize.y * yInBoard);
		}
	}

}
